/**  
* @Title: QiNiuutil.java 
* @Description:
* @Copyright: Copyright (c) 2018
* @Company:http://www.sinocon.cn
* @author Administrator  
* @date 2018年3月29日  
* @version 1.0  
*/
package com.yuanlinsu.common;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Recorder;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.persistent.FileRecorder;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;

/**
 * @Title: QiNiuutil
 * @Description:
 * @author:Administrator
 * @date 2018年3月29日
 */
public class QiNiuutil {
	private static Log logger = LogFactory.get();
	// 设置好账号的ACCESS_KEY和SECRET_KEY
	private final static String ACCESS_KEY = "***************";
	private final static String SECRET_KEY = "***************";

	// 域名
	private final static String domainOfBucket = "http://***********.com/";
	// 密匙配置
	private final static Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
	// 创建上传对象
	private final static UploadManager uploadManager = new UploadManager();

	/**
	 * @author weirdor 覆盖上传凭证
	 * @param bucketName
	 *            空间名称
	 * @param key
	 *            上传到七牛后保存的文件名 2017年06月29日14:52:28
	 */
	public String getUpToken(String bucketname, String key) {

		return auth.uploadToken(bucketname, key);

	}

	/**
	 * @author weirdor 简单上传凭证
	 * @param bucketName
	 *            空间名称 2017年06月29日14:52:14
	 */
	public static String getUpToken(String bucketname) {
		StringMap putPolicy = new StringMap();
		// 自定义上传回复凭证
		putPolicy.put("returnBody",
				"{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
		long expireSeconds = 3600;
		return auth.uploadToken(bucketname, null, expireSeconds, putPolicy);

	}

	/**
	 * @author weirdor 简单上传
	 * @param filePath
	 *            文件路径 （也可以是字节数组、或者File对象）
	 * @param key
	 *            上传到七牛上的文件的名称 （同一个空间下，名称【key】是唯一的）
	 * @param bucketName
	 *            空间名称 （这里是为了获取上传凭证）
	 * 
	 *            2017年06月29日14:52:08
	 */
	public static Object simpleupload(String filePath, String key, String bucketName) {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			String token = getUpToken(bucketName);
			// 调用put方法上传
			Response res = uploadManager.put(filePath, key, token);
			if (res.statusCode == 200 && res.isOK()) {
				logger.debug("上传成功");
				map.put("url", domainOfBucket + key);
				map.put("result", "success");
			}
		} catch (QiniuException e) {

			e.printStackTrace();
			map.put("result", "fail");
		}
		return map;
	}

	/**
	 * @author weirdor 断点续传
	 * @throws IOException
	 * @param filePath
	 *            文件路径 （也可以是字节数组、或者File对象）
	 * @param key
	 *            上传到七牛上的文件的名称 （同一个空间下，名称【key】是唯一的）
	 * @param bucketName
	 *            空间名称 （这里是为了获取上传凭证）
	 * @2017年06月29日14:51:10
	 * 
	 */

	public static Object breakpointUpload(String filePath, String key, String bucketName) throws IOException {
		Map<String, Object> map = new HashMap<String, Object>();
		// 设置凭证
		String bucket = "weirdor";
		// 设置一个临时文件存放地址
		String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), bucket).toString();
		// 实例化recorder对象
		Recorder recorder = new FileRecorder(localTempDir);
		// 实例化上传对象，并且传入一个recorder对象
		UploadManager uploadManager = new UploadManager(recorder);
		// token值
		String token = getUpToken(bucketName);
		try {
			// 调用put方法上传
			Response res = uploadManager.put(filePath, key, token);
			// 是否上传成功
			if (res.statusCode == 200 && res.isOK()) {
				logger.debug("上传成功");
				map.put("url", domainOfBucket + key);
				map.put("result", "success");
			}
		} catch (QiniuException e) {
			logger.debug("上传失败");
			e.printStackTrace();
			map.put("result", "fail");
		}
		return map;

	}

	// 测试
	public static void main(String[] args) throws IOException {
		// 断点续传
		Object map = breakpointUpload("/Users/weirdor/Downloads/googlechrome_mac_55.0.2883.95.dmg", "Postman.dmg",
				"asstes");
		System.out.println(map);
	}
}
